package com.cn.web.dao.utils;

import static org.apache.ibatis.jdbc.SqlBuilder.BEGIN;
import static org.apache.ibatis.jdbc.SqlBuilder.FROM;
import static org.apache.ibatis.jdbc.SqlBuilder.INSERT_INTO;
import static org.apache.ibatis.jdbc.SqlBuilder.SELECT;
import static org.apache.ibatis.jdbc.SqlBuilder.SET;
import static org.apache.ibatis.jdbc.SqlBuilder.SQL;
import static org.apache.ibatis.jdbc.SqlBuilder.UPDATE;
import static org.apache.ibatis.jdbc.SqlBuilder.VALUES;
import static org.apache.ibatis.jdbc.SqlBuilder.WHERE;

import java.util.Map;


/**
 * MyBatis 主要的SqlProvider生成类
 * 
 * @author love
 */
public class SqlProviderTemplate{
	
	/**
	 * 根据entity实体类生成插入SQL文
	 * 
	 * @param entity entity实体类
	 * 
	 * @return 插入SQL文
	 * @throws Exception 抛出异常
	 */
	public String insert(Object entity) throws Exception {
		BEGIN();
		INSERT_INTO(EntityUtil.tablename(entity));
		EntityUtil.caculationColumnList(entity);
		VALUES(EntityUtil.returnInsertColumnsName(entity), EntityUtil.returnInsertColumnsDefine(entity));
		return SQL();
	}
	
	/**
	 * 根据entity实体类生成更新SQL文
	 * 
	 * @param entity entity实体类
	 * 
	 * @return 更新SQL文
	 * @throws Exception 抛出异常
	 */
	public String update(Object entity) throws Exception {
		BEGIN();
		UPDATE(EntityUtil.tablename(entity));
		EntityUtil.caculationColumnList(entity);
		SET(EntityUtil.getUpdateSet(entity));
		WHERE(EntityUtil.getUpdateWhere(entity));
		return SQL();
	}
	
	/**
	 * 根据entity实体类生成逻辑删除SQL文（更新record_status、update_user、update_time三个字段）
	 * 
	 * @param entity entity实体类
	 * 
	 * @return 逻辑删除SQL文
	 * @throws Exception 抛出异常
	 */
	public String delete(Object entity) throws Exception {
		BEGIN();
		UPDATE(EntityUtil.tablename(entity));
		EntityUtil.caculationColumnList(entity);
		SET(EntityUtil.getDeleteSet(entity));
		WHERE(EntityUtil.getUpdateWhere(entity));
		return SQL();
	}
	
	/**
	 * 根据id和entityClass生成检索id检索SQL文
	 * 
	 * @param obj 包含： Long id,Class<?> entityClass
	 * 
	 * @return id检索SQL文
	 * @throws Exception 抛出异常
	 */
	public  String selectByKey(Map<?, ?> obj) throws Exception {
		BEGIN();
		Class<?> cla = (Class<?>) obj.get("1");
		SELECT(EntityUtil.getSelectColumnsName(cla));
		FROM(EntityUtil.getSelectTableName(cla));
		WHERE(EntityUtil.getSelectByKey());
		return SQL();
	}
	
	/**
	 * 根据id和entityClass生成检索id检索SQL文
	 * 
	 * @param obj 包含： Long id,Class<?> entityClass
	 * 
	 * @return id检索SQL文
	 * @throws Exception 抛出异常
	 */
	public  String selectByParams(Object entity) throws Exception {
		BEGIN();
		SELECT(EntityUtil.getSelectColumnsName(entity.getClass()));
		FROM(EntityUtil.getSelectTableName(entity.getClass()));
	    
		WHERE(EntityUtil.getSelectSql(entity));
		return SQL();
	}
}

